// 获取原始的数组原型链
let oldArrayProperty = Array.prototype
// 复制一份出来，到新的对象中
export let newArrayProperty = Object.create(oldArrayProperty)

// 声明数组的变异方法有哪些
let methods = ["push", "pop", "unshift", "shift", "reserve", "sort", "splice"]

methods.forEach(method => {
    // 调用新的方法时，接收传递进来的参数，然后再调用一下原来的
    newArrayProperty[method] = function (...args) {
        // 判断如果是下面的几个方法，则要对传递进来的参数继续进行响应式处理
        let inserted;
        // 这里的this指向的是函数的调用者，所以这里的this指向的是data，也就是在Observer类中接收到data
        // 恰好我们给data的__ob__属性设置了值，等于Observe实例，
        // 利用这点就可以拿到Observe中的observeArray方法，来对新数据进行响应式处理
        let ob = this.__ob__
        switch (method) {
            case "push":
            case "unshift":
            case "shift":
                inserted = args;
                break
            case "splice":
                inserted = args.slice(2)
                break
            default:
                break;
        }
        if(inserted){
            // 对传递进来的参数继续进行响应式处理
            ob.observeArray(inserted)
        }
        ob.dep.notify()
        // 将结果返回
        return oldArrayProperty[method].call(this, ...args);
    }
})